package initialize

import (
	"bytes"
	"fmt"
	"github.com/gobuffalo/packr"
	"github.com/spf13/viper"
	"interview/pkg/global"
	"os"
)

const (
	configType        = "yml"
	configPath        = "../conf"
	developmentConfig = "config.dev.yml"
	stagingConfig     = "config.stage.yml"
	productionConfig  = "config.prod.yml"
)

// InitConfig 初始化配置文件
func InitConfig() {
	// 使用packr将配置文件打包到二进制文件中, 如果以docker镜像方式运行将会非常舒服
	global.ConfBox = packr.NewBox(configPath)

	// 读取配置文件
	v := viper.New()
	//v.SetConfigType(configType)
	//v.SetConfigName(developmentConfig)
	//v.AddConfigPath(configPath)
	//err := v.ReadInConfig()
	//if err != nil {
	//	return
	//}
	// 读取开发环境配置
	readingConfig(v, developmentConfig)

	//TODO 将default中的配置全部以默认配置写入 => why?
	settings := v.AllSettings()
	for i, s := range settings {
		v.SetDefault(i, s)
	}

	// 读取 go env
	env := os.Getenv("GO_ENV")
	configName := ""
	if env == "staging" {
		configName = stagingConfig
	} else if env == "production" {
		configName = productionConfig
	}
	// 读取不同环境中的差异部分
	if configName != "" {
		readingConfig(v, configName)
	}

	// 转换为结构体
	err := v.Unmarshal(&global.Conf)
	if err != nil {
		panic(fmt.Sprintf("设置系统配置失败: %v", err))
	}
}

func readingConfig(v *viper.Viper, configFile string) {
	v.SetConfigType(configType)
	config, err := global.ConfBox.Find(configFile)
	if err != nil {
		panic(fmt.Sprintf("初始化配置文件失败: %v", err))
	}
	// 加载配置
	err = v.ReadConfig(bytes.NewReader(config))
	if err != nil {
		panic(fmt.Sprintf("加载配置文件失败: %v", err))
	}
}
